package team.api;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import org.apache.log4j.Logger;

import study.itwill.common.DBHandler;
import team.item.health_re_saveItem;


/**
 * CRUD 처리를 하는 클래스 만들기
 * ----------------------------------------------------------
 * -------------------- 데이터 입출력이 필요한 기능에 대하여, CREATE, READ, UPDATE, DELETE에 해당하는
 * 메소드를 구현해 놓는 처리를 말한다.
 * ----------------------------------------------------------
 * -------------------- CREATE --> SQL의 INSERT 구문을 실행한다. READ --> SQL의 SELECT
 * 구문을 실행한다. UPDATE --> SQL의 UPDATE 구문을 실행한다. DELETE --> SQL의 DELETE 구문을 실행한다.
 * --
 * ----------------------------------------------------------------------------
 * CRUD에 해당하는 기능들은 어떤 데이터 처리를 목적으로 하는지가 정해져야한다
 * 
 * ex) 학생 데이터의 입출력 교수 데이터의 입출력 회원 데이터의 입출력 게시물 데이터의 입출력 카테고리 데이터의 입출력 상품 데이터의
 * 입출력
 * --------------------------------------------------------------------------
 * ---- 메소드들의 이름은 "동사" + "목적어" 형식으로 작성한다 ex) 학생 데이터의 입출력인 경우 --> insertStudent,
 * updateStudent, deleteStudent, selectStudent
 * ----------------------------------
 * -------------------------------------------- insert 기능의 경우, 각 데이터를 판별할 수 있는
 * 고유한 값(PK)를 제외하고 INSERT에 처리한 모든 값들을 메소드 파라미터로 전달받아야한다 데이터 형은 테이블 구조를 참조하면 된다
 * 
 * 메소드의 수행 결과는 새롭게 추가된 데이터의 일련번호(seq)를 리턴해 주어야 한다
 * --------------------------------
 * ---------------------------------------------- update, delete의 경우 결과를 리턴해 주어야
 * 한다 --> boolean 값을 리턴한다.
 * 
 * UPDATE, DELETE는 각 데이터를 판별할 수 있는 고유한 값(PK)를 파라미터로 전달 받는다 그 외에 추가적으로 일괄 삭제나, 일괄
 * 수정등을 목적으로 할 경우 상황에 따라 파라미터 형태를 변경할 수 있다.
 * --------------------------------------
 * ---------------------------------------- 이 클래스들은 DATABASE 접속이 성공 한 이후에 호출된다고
 * 가정되어야 한다.
 */

public class health_re_save {

	static Logger logger = Logger.getLogger(health_re_save.class);

	private static final String TABLE = "health_re_save";

	public int inserthealth_re_save(String h_reply,
			int member_seq, int h_video_save_seq) {
		// ---------------------------------------------
		// 메소드 시작
		// ---------------------------------------------
		logger.debug("=================== method start >> inserthealth_re_save");

		logger.debug("[PARAMS] h_reply = " + h_reply);

		logger.debug("[PARAMS] member_seq = " + member_seq);
		logger.debug("[PARAMS] h_video_save_seq = " + h_video_save_seq);

		// SQL 인젝션 방어
		h_reply = h_reply.replace("'", "\'");
		

		// ---------------------------------------------------------------
		// 로직 구현
		// ---------------------------------------------------------------
		// 테이블이 자동 증가가 아니므로,
		// 최대값 + 1 형식으로 메소드 안에서 생성한다
		

	

		// 트렌젝션에 대한 판단이 잘 서지 않는다면,
		// 무조건 하면 된다.
		DBHandler.beginTrans();

		// INSERT 처리를 위한 구현
		String sql = "INSERT INTO health_re_save("
				+ "h_reply,reg_date,edit_date,member_seq,"
				+ "h_video_save_seq" 
				+ ") VALUES ("
				+ " '%s', now(), now(), %d, %d);";

		boolean result = DBHandler.execSql(sql,  h_reply, 
				 member_seq, h_video_save_seq);
		int seq = -1;

		// -----------------------------------------------------------------
		// 결과처리
		// -----------------------------------------------------------------

		if (result) {

			DBHandler.commit();
			 seq = DBHandler.getMax(TABLE, "seq", null) ;
			logger.debug("처리결과 >> " + seq + "번 뎃글 등록 성공");
		} else {
			DBHandler.rollback();
			logger.debug("처리결과 >> 데이터 추가 실패");
		}

		logger.debug("===================== method end >> inserthealth_re_save");

		return seq;

	}

	public boolean updatehealth_re_save(int seq, String h_reply,
			  int member_seq,
			int h_video_save_seq) {

		logger.debug("=================== method start >> inserthealth_re_save");

		logger.debug("[PARAMS] seq = " + seq);
		logger.debug("[PARAMS] h_reply = " + h_reply);
		
		logger.debug("[PARAMS] member_seq = " + member_seq);
		logger.debug("[PARAMS] h_video_save_seq = " + h_video_save_seq);
		
		// 리턴할 값 선언
		boolean result = false;

		// SQL 인젝션 방어
		h_reply = h_reply.replace("'", "\'");
	

		// 트렌젝션에 대한 판단이 잘 서지 않는다면,
		// 무조건 하면 된다.
		DBHandler.beginTrans();

		String sql = "UPDATE health_re_save "
				+ "set h_reply = '%s' ,"
				+ "edit_date = now() , member_seq = %d ,"
				+ "h_video_save_seq = %d "
				+ "WHERE seq = %d;";

		result = DBHandler.execSql(sql, h_reply, 
				member_seq, h_video_save_seq,
				seq);

		// ---------------------------------------------
		// 결과처리
		// ---------------------------------------------

		if (result) {
			DBHandler.commit();
			logger.debug("처리결과 >> " + seq + "번 학생 수정 성공");
		} else {
			DBHandler.rollback();
			logger.debug("처리결과 >> 데이터 삭제 실패");
		}

		logger.debug("=========== method end >> updatehealth_re_save");

		return result;
	}

	public boolean deletehealth_re_save(int seq) {
		logger.debug("======================== method start >> deleteseq");
		logger.debug("[PARAMS] seq = " + seq);

		boolean result = false;

		DBHandler.beginTrans();

		String sql = "DELETE FROM health_re_save WHERE seq = %d";
		result = DBHandler.execSql(sql, seq);

		if (result) {
			DBHandler.commit();
			logger.debug("처리결과 >> " + seq + "번 학생 삭제 성공");
		} else {
			DBHandler.rollback();
			logger.debug("처리결과 >> 데이터 삭제 실패");
		}

		logger.debug("============================ method end >> deleteseq");

		return result;
	}

	/**
	 * 학생 한명의 데이터를 조회하여 리턴하는 메소드
	 * 
	 * @param studno
	 * @return StudentItem
	 */

	public health_re_saveItem selecthealth_re_save(int seq) {
		logger.debug("======================== method start >> selecthealth_re_save");
		logger.debug("[PARAMS] seq = " + seq);

		health_re_saveItem item = null;

		// 데이터조회

		String sql = "SELECT seq, h_reply, reg_date, edit_date ,"
				+ "member_seq, h_video_save_seq "
				+ "From health_re_save "
				+ "WHERE seq = %d;";

		ResultSet rs = DBHandler.getResult(sql, seq);

		if (rs != null) {
			// 데이터 조회 결과 있는 경우
			try {
				rs.next();

				// 1) ResultSet의 모든 데이터를 변수로 추출

				int sno = rs.getInt(0);
				String h_reply = rs.getString(1);
				String reg_date = rs.getString(2);
				String edit_date = rs.getString(3);
				int member_seq = rs.getInt(4);
				int h_video_save_seq = rs.getInt(5);
				String user_id = rs.getString(6);

				// 2) 추출된 값을 객체로 구성
				item = new health_re_saveItem(sno, h_reply, reg_date,
						edit_date, member_seq, h_video_save_seq,user_id);

			} catch (SQLException e) {
				logger.error(e);
			} finally {
				// 3) 데이터 조회에 대한 메모리 반납
				try {
					rs.close();
				} catch (SQLException e) {
				}
				rs = null;
			}

		}

		if (item == null) {
			logger.error("데이터 조회 실패");
		} else {
			logger.debug("데이터 조회 성공");
			logger.debug(item.toString());
		}

		logger.debug("================== method end >> selectStudent");

		return item;
	}

	/**
	 * 학생목록의 데이터를 조회하여 리턴하는 메소드
	 * 
	 * @param stduno
	 * @return ArrayList<StudentItem>
	 */

	public ArrayList<health_re_saveItem> selecthealth_re_saveList(int p_grade) {
		logger.debug("================== method start >> selecthealth_re_save");

		ArrayList<health_re_saveItem> list = null;

		// 데이터 조회

		String sql = "SELECT seq, h_reply, reg_date, edit_date"
				+ "member_seq, h_video_save_seq "
				+ "From health_re_save;";

		// 파라미터에 따라서 검색조건 지정

		if (p_grade > 0) {
			sql += " WHERE seq='" + p_grade + "'";
		}

		ResultSet rs = DBHandler.getResult(sql);

		if (rs != null) {
			// 데이터 조회 결과 있는 경우
			try {
				list = new ArrayList<health_re_saveItem>();

				while (rs.next()) {

					// 1) ResultSet의 모든 데이터를 변수로 추출

					int sno = rs.getInt(0);
					String h_reply = rs.getString(1);
					String reg_date = rs.getString(2);
					String edit_date = rs.getString(3);
					int member_seq = rs.getInt(4);
					int h_video_save_seq = rs.getInt(5);
					String user_id = rs.getString(6);

					
					// 2) 추출된 값을 객체로 구성
					health_re_saveItem item = new health_re_saveItem(sno,h_reply,reg_date,edit_date,member_seq,h_video_save_seq,user_id);

					// 3) ArrayList에 추가
					list.add(item);

				}
			} catch (SQLException e) {
				logger.error(e);
			} finally {
				// 4) 데이터 조회에 대한 메모리 반납
				try {
					rs.close();
				} catch (SQLException e) {
				}
				rs = null;
			}
		}

		if (list == null) {
			logger.error("데이터 조회 실패");
		} else {
			logger.debug("데이터 조회 성공 >> " + list.size() + "건 조회됨");
		}

		logger.debug("================== method end >> selecthealth_re_save");

		return list;

	}

	/**
	 * 댓글 보기 -
	 * 댓글목록의 데이터를 조회하여 리턴하는 메서드
	 * @return	ArrayList<health_re_saveItem>
	 */
	public ArrayList<health_re_saveItem> selecthreplyList(int seq) {
		logger.debug("=============== method start >> selecthreplyList");
		
		ArrayList<health_re_saveItem> list = null;
		
		// 데이터 조회
		String sql = "SELECT\n" +
				"	m.user_id,\n" +
				"	r.h_reply\n" +
				"FROM\n" +
				"	health_re_save r\n" +
				"INNER JOIN h_video_save v ON v.seq = r.h_video_save_seq\n" +
				"INNER JOIN member m ON m.seq = r.member_seq";
		
		/* 파라미터에 따라서 검색조건 지정
		if(p_grade > 0) {
			sql += " WHERE grade='" + p_grade + "'";
		}*/
		
		ResultSet rs = DBHandler.getResult(sql);
		
		if(rs != null) {
			// 데이터 조회 결과 있는 경우
			try {
				list = new ArrayList<health_re_saveItem>();
				
				while(rs.next()) {
					
					// 1) ResultSet의 모든 데이터를 변수로 추출
					int sno = rs.getInt(0);
					String h_reply = rs.getString(1);
					String reg_date = rs.getString(2);
					String edit_date = rs.getString(3);
					int member_seq = rs.getInt(4);
					int h_video_save_seq = rs.getInt(5);
					String user_id = rs.getString(6);
					
					
					// 2) 추출된 값을 객체로 구성
					health_re_saveItem item = new health_re_saveItem(sno,h_reply,reg_date,edit_date,member_seq,h_video_save_seq,user_id);
					
					// 3) ArrayList에 추가
					list.add(item);
				}
			} catch (SQLException e) {
				logger.error(e);
			} finally {
				// 4) 데이터 조회에 대한 메모리 반납
				try {
					rs.close();
				} catch (SQLException e) {}
				rs = null;
			}
		}
		
		if(list == null) {
			logger.error("데이터 조회 실패");
		} else {
			logger.debug("데이터 조회 성공 >> " + list.size() + "건 조회됨");
		}
		
		logger.debug("=============== method end >> selecthreplyList");
		
		return list;
	}

	/**
	 * 댓글 작성
	 * 
	 * @param h_video_save_seq
	 *            운동법 글 번호
	 * @param member_seq
	 *            댓글 작성자 번호
	 * @param h_reply
	 *            댓글 내용
	 * @return seq 운동법 글 번호
	 */

	public int h_reply_write(int h_video_save_seq, int member_seq,
			String h_reply) {

		// -----------------------------------------
		// 메서드 시작
		// -----------------------------------------
		logger.debug("=============== method start >> h_reply_write");
		logger.debug("h_video_save_seq: " + h_video_save_seq);
		logger.debug("member_seq: " + member_seq);
		logger.debug("h_reply: " + h_reply);

		// 리턴할 값 선언
		int seq = -1;

		// SQL 인젝션 방어
		h_reply = h_reply.replace("'", "\'");


		// 트랜젝션에 대한 판단이 잘 서지 않는다면, 무조건 하면 된다.
		DBHandler.beginTrans();

		// INSERT 처리를 위한 구현
		String sql = "INSERT INTO h_reply_save("
				+ "h_video_save_seq, member_seq, h_reply, reg_date, edit_date"
				+ ") VALUES (" + "%d, %d, '%s', now(), now())";

		boolean result = DBHandler.execSql(sql, h_video_save_seq,
				member_seq, h_reply);

		// -----------------------------------------
		// 결과처리
		// -----------------------------------------
		if (result) {
			seq = h_video_save_seq;
			DBHandler.commit();
			logger.debug("처리결과 >> " + seq + "번 댓글 등록 성공");
		} else {
			DBHandler.rollback();
			logger.error("처리결과 >> 데이터 추가 실패");
		}

		logger.debug("=============== method end >> h_reply_write");

		return seq;
	}

	/**
	 * 댓글 수정
	 * 
	 * @param seq
	 *            일련번호
	 * @param health_name
	 *            운동법
	 * @param reg_date
	 *            등록일시
	 * @param edit_date
	 *            수정일시
	 * @return
	 */
	public boolean h_reply_update(int seq, int h_video_save_seq,
			int member_seq, String h_reply) {

		logger.debug("============ method start >> h_reply_update");
		logger.debug(" -- [PARAMS INFO] -- ");
		logger.debug("seq: " + seq);
		logger.debug("h_video_save_seq: " + h_video_save_seq);
		logger.debug("member_seq: " + member_seq);
		logger.debug("h_reply: " + h_reply);
		

		boolean result = false;

		// SQL 인젝션 방어
		h_reply = h_reply.replace("'", "\'");

		DBHandler.beginTrans();

		String sql = "UPDATE h_reply_save SET h_video_save_seq = %d, member_seq = %d, h_reply = '%s', edit_date = now() WHERE seq = %d;";

		result = DBHandler.execSql(sql, h_video_save_seq, member_seq, h_reply);

		if (result) {
			DBHandler.commit();
			logger.debug("처리결과 >> " + seq + "번 댓글 수정성공");
		} else {
			DBHandler.rollback();
			logger.error("처리결과 >> 데이터 수정 실패 ");
		}
		
		logger.debug("============ method end >> h_reply_update");
		
		return result;

	}
	/**
	  * 댓글 삭제
	  * 
	  * @param seq 회원일련번호	 
	  * @return
	  */
	 public boolean h_reply_delete(int seq) {		 
		 logger.debug("============ method end >> h_reply_delete");
			logger.debug(" -- [PARAMS INFO] -- ");	
			logger.debug("seq: " + seq);
			
			boolean result = false;
			
			DBHandler.beginTrans();
			
			String sql = "DELETE FROM health_re_save WHERE member_seq = %d";
			result = DBHandler.execSql(sql, seq);
			
			if(result) {
				DBHandler.commit();
				logger.debug("처리결과 >> " + seq + "번 댓글 삭제 성공");
			} else {
				DBHandler.rollback();
				logger.error("처리결과 >> 데이터 삭제 실패 ");
			}
			
		
		 logger.debug("============ method end >> h_reply_delete");

		 return result;
	 }

}
